// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.*;
// import com.alibaba.druid.sql.ast.statement.*;
// import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.expr.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly;
// import com.alibaba.druid.sql.dialect.oracle.parser.OracleFunctionDataType;
// import com.alibaba.druid.sql.dialect.oracle.parser.OracleProcedureDataType;
// import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;

// import java.util.List;
#pragma once
#include "OracleASTVisitor.h"
#include "../../../visitor/SQLASTOutputVisitor.h"

class OracleOutputVisitor : virtual public SQLASTOutputVisitor, virtual public OracleASTVisitor
{
public:
  BOOL_ptr printPostSemi;

  OracleOutputVisitor(std::stringstream *appender);

  OracleOutputVisitor(std::stringstream *appender, BOOL_ptr printPostSemi);

  BOOL_ptr isPrintPostSemi();

  void printHints(SQLHint_list_ptr hints);

  BOOL_ptr visit(OracleAnalytic_ptr x);

  BOOL_ptr visit(OracleAnalyticWindowing_ptr x);

  BOOL_ptr visit(OracleDeleteStatement_ptr x);

  BOOL_ptr visit(OracleIntervalExpr_ptr x);

  BOOL_ptr visit(OracleOuterExpr_ptr x);

  bool visit(SQLScriptCommitStatement_ptr astNode);

  bool visit(SQLSelect_ptr x);

  BOOL_ptr visit(OracleSelectJoin_ptr x);

  bool visit(SQLSelectOrderByItem_ptr x);

  bool visit(SQLSelectQueryBlock_ptr select);

  bool visit(OracleSelectQueryBlock_ptr x);

  BOOL_ptr visit(OracleSelectRestriction_CheckOption_ptr x);

  BOOL_ptr visit(OracleSelectRestriction_ReadOnly_ptr x);

  BOOL_ptr visit(OracleSelectSubqueryTableSource_ptr x);

  BOOL_ptr visit(OracleSelectTableReference_ptr x);

  void printFlashback(SQLExpr_ptr flashback);

  BOOL_ptr visit(OracleUpdateStatement_ptr x);

  // @Override
  BOOL_ptr visit(SampleClause_ptr x);

  // @Override
  BOOL_ptr visit(PartitionExtensionClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleWithSubqueryEntry_ptr x);

  // @Override
  BOOL_ptr visit(SearchClause_ptr x);

  // @Override
  BOOL_ptr visit(CycleClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleBinaryFloatExpr_ptr x);

  // @Override
  BOOL_ptr visit(OracleBinaryDoubleExpr_ptr x);

  // @Override
  BOOL_ptr visit(OracleIsSetExpr_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_ReturnRowsClause_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_MainModelClause_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_ModelColumnClause_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_QueryPartitionClause_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_ModelColumn_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_ModelRulesClause_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_CellAssignmentItem_ptr x);

  // @Override
  BOOL_ptr visit(ModelClause_CellAssignment_ptr x);

  // @Override
  BOOL_ptr visit(OracleReturningClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleInsertStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleMultiInsertStatement_InsertIntoClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleMultiInsertStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleMultiInsertStatement_ConditionalInsertClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleMultiInsertStatement_ConditionalInsertClauseItem_ptr x);

  // @Override
  BOOL_ptr visit(OracleLockTableStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterSessionStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleDatetimeExpr_ptr x);

  // @Override
  BOOL_ptr visit(OracleSysdateExpr_ptr x);

  // @Override
  BOOL_ptr visit(OracleExceptionStatement_Item_ptr x);

  // @Override
  BOOL_ptr visit(OracleExceptionStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleArgumentExpr_ptr x);

  // @Override
  BOOL_ptr visit(OracleSetTransactionStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleExplainStatement_ptr x);

  // @Override
  bool visit(SQLAlterProcedureStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableDropPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableTruncatePartition_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableSplitPartition_TableSpaceItem_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableSplitPartition_UpdateIndexesClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableSplitPartition_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableSplitPartition_NestedTablePartitionSpec_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableModify_ptr x);

  // @Override
  BOOL_ptr visit(OracleCreateIndexStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleForStatement_ptr x);

  // @Override
  bool visit(SQLIfStatement_Else_ptr x);

  // @Override
  bool visit(SQLIfStatement_ElseIf_ptr x);

  // @Override
  bool visit(SQLIfStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleRangeExpr_ptr x);

  void visitColumnDefault(SQLColumnDefinition_ptr x);

  // @Override
  BOOL_ptr visit(OraclePrimaryKey_ptr x);

  void printConstraintState(OracleConstraint_ptr x);

  // @Override
  BOOL_ptr visit(OracleCreateTableStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleStorageClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleGotoStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleLabelStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTriggerStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterSynonymStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterViewStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableMoveTablespace_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableRowMovement_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTableShrinkSpace_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterSummaryStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleFileSpecification_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTablespaceAddDataFile_ptr x);

  // @Override
  BOOL_ptr visit(OracleAlterTablespaceStatement_ptr x);

  // @Override
  bool visit(SQLTruncateStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleExitStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleContinueStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleRaiseStatement_ptr x);

  // @Override
  bool visit(SQLSavePointStatement_ptr x);

  // @Override
  bool visit(SQLCreateFunctionStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleCreateDatabaseDbLinkStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleDropDbLinkStatement_ptr x);

  bool visit(SQLCharacterDataType_ptr x);

  // @Override
  BOOL_ptr visit(OracleDataTypeIntervalYear_ptr x);

  // @Override
  BOOL_ptr visit(OracleDataTypeIntervalDay_ptr x);

  // @Override
  BOOL_ptr visit(OracleUsingIndexClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleLobStorageClause_ptr x);

  // @Override
  BOOL_ptr visit(OracleUnique_ptr x);

  // @Override
  BOOL_ptr visit(OracleForeignKey_ptr x);

  // @Override
  BOOL_ptr visit(OracleCheck_ptr x);

  // @Override
  void printCascade();

  BOOL_ptr visit(SQLCharExpr_ptr x, BOOL_ptr parameterized);

  // @Override
  BOOL_ptr visit(OracleSupplementalIdKey_ptr x);

  // @Override
  BOOL_ptr visit(OracleSupplementalLogGrp_ptr x);

  BOOL_ptr visit(OracleCreateTableStatement_Organization_ptr x);

  BOOL_ptr visit(OracleCreateTableStatement_OIDIndex_ptr x);

  // @Override
  BOOL_ptr visit(OracleCreatePackageStatement_ptr x);

  // @Override
  bool visit(SQLAssignItem_ptr x);

  // @Override
  BOOL_ptr visit(OracleExecuteImmediateStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleTreatExpr_ptr x);

  // @Override
  BOOL_ptr visit(OracleCreateSynonymStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleCreateTypeStatement_ptr x);

  // @Override
  BOOL_ptr visit(OraclePipeRowStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleIsOfTypeExpr_ptr x);

  // @Override
  BOOL_ptr visit(OracleRunStatement_ptr x);

  // @Override
  BOOL_ptr visit(OracleXmlColumnProperties_ptr x);

  // @Override
  bool visit(SQLExprTableSource_ptr x);

  // @Override
  BOOL_ptr visit(OracleXmlColumnProperties_OracleXMLTypeStorage_ptr x);

  bool visit(SQLSubPartition_ptr x);

  bool visit(SQLPartitionValue_ptr x);
};
